home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / gara2 / spp / src / spp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  18.4 KB  |  774 lines

  1. /* スプライトプロセッサ */
  2. #include    <stdio.h>
  3. #include    <stdlib.h>
  4. #include    <string.h>
  5. #include    <msdos.cf>
  6.  
  7. #include    <egb.h>
  8. #include    <mos.h>
  9. #include    <sidework.h>
  10.  
  11. #include    "ysuty2.h"
  12. #include    "s_button.h"
  13. #include    "optimize.h"
  14.  
  15.  
  16. /* マクロ、ラベルの定義 */
  17. #define        sprWin_x        (24)
  18. #define        sprWin_y        (28)
  19. #define        sprWinStep_x    (80)
  20. #define        sprWinStep_y    (110)
  21.  
  22. #define        view_x0            (88)
  23. #define        view_y0            (62)
  24. #define        view_lx            (337)
  25. #define        view_ly            (357)
  26.  
  27. #define        print_x            (280)
  28. #define        print_y            (2)
  29.  
  30. #define        US                unsigned
  31.  
  32. #define        C_BACK2            _C(4,14,2)
  33. #define        C_BACK            _C(4,8,16)
  34.  
  35.  
  36. /* グローバル変数の宣言 */
  37. char    gwork[1536];
  38. char    mwork[4096];
  39. char    mpwork[258];
  40. ITEM    *itm[30];
  41. char    *Pbuf;                /* PATファイル用バッファ */
  42. char    *TMPbuf;            /* テンポラリーな使い回せるバッファ */
  43. char    *Ybuf;                /* YSPファイル用バッファ */
  44. int        OP_LEVEL=80;        /* 最適化レベル(の平方根) */
  45. int        WINTOP;                /* 一番左上に表示されているパターンの番号の1/6 */
  46.  
  47. FILE    *fp,*fp2;
  48. char    *title_PD[]={"サイドワーク","現在のフリーメモリ","画面の再描画",NULL};
  49. char    *fileMenu_PD[]={"ARTemisのパターン新規読み込み","ARTemisのパターン追加読み込み","ARTemisのパターンとして保存","SPP新規読み込み","SPP保存",NULL};
  50. char    *optimize_PD[]={"全部16色化","全部32K色化","16色以下しか使ってない32Kパターン全部を16色化","パレット番号の整理","範囲指定の16色化","範囲指定の32K色化","退避中のパレットによる16色化","透過色の指定",NULL};
  51. char    *zoomStr[]={" ×1 "," ×2 "," ×4 "," ×8 ","×16",NULL};
  52. char    *meyastr[]={"細かく","中庸","幅広く"};        /* 目安(^^;) */
  53.  
  54.  
  55. /* ソースファイルが長いのはやだ、しかし・・・(^^;) */
  56. #include    "sppm.c"
  57.  
  58.  
  59.  
  60. /* 各種初期化 */
  61.  
  62. void    init()
  63. {
  64.     YGB_init(gwork,17,10);
  65.     YGB_writePage(gwork,0);
  66.     YGB_writeMode(gwork,PSET);
  67.     YGB_use12dotFont();
  68.     
  69.     MOS_start(mwork,4096);
  70.     MOS_resolution(0,17);
  71.     MOS_writePage(0);
  72.     MOS_color(0,_C(31,31,31));
  73.     MOS_typeRom(81,0,0,mpwork);
  74.     MOS_setpos(256,240);
  75.     MOS_horizon(0,505);
  76.     MOS_vertical(0,473);
  77.     
  78.     YGB_color(gwork,0);
  79.     YGB_boxFul(gwork,0,0,511,479);
  80.     YGB_fontSize(gwork,6,12);
  81.     
  82.     return;
  83. }
  84.  
  85.  
  86. /* 終了の前処理 */
  87. void    term()
  88. {
  89.     MOS_disp(0);
  90.     MOS_end();
  91.     return;
  92. }
  93.  
  94.  
  95. /* アイテム登録、初期画面の描画 */
  96. ITEM    *addItems()
  97. {
  98.     int        x,y,i,j;
  99.     char    *buf;
  100.     ITEM    *top;
  101.     
  102.     YGB_writeMode(gwork,PSET);
  103.     /* 背景色 */
  104.     YGB_color(gwork,C_BACK);
  105.     YGB_boxFul(gwork,0,0,511,479);
  106.     
  107.     /* 画面上方の溝(?) */
  108.     YGB_color(gwork,C_BACK);
  109.     YGB_boxFul(gwork,259,-2,494,18);
  110.     
  111.     /* EXITボタン (itm[0])*/
  112.     SGB_gradProButton(gwork,493,0,511,18,_C(24,24,24),_C(8,8,8),0);
  113.     top=YGU_addButton(NULL,493,0,18,18);
  114.     
  115.     
  116.     /* タイトル (itm[1])*/
  117.     SGB_gradProButton(gwork,0,0,112,18,_C(12,12,12),_C(0,0,0),0);
  118.     YGB_color(gwork,_C(25,25,25));
  119.     YGB_fontSize(gwork,6,12);
  120.     YGB_print(gwork,15,14,"SPP Ver1.00");
  121.     YGB_color(gwork,_C(27,27,27));
  122.     YGB_print(gwork,16,14,"SPP Ver1.00");
  123.     YGU_addPullDownMenu(top,0,0,112,18,title_PD,0,19,6,12);
  124.     
  125.     /* ファイルメニュー (itm[2])*/
  126.     SGB_proButton(gwork,113,0,192,18, _C(0,0,0));
  127.     YGB_color(gwork,_C(27,27,27));
  128.     YGB_print(gwork,128,14,"ファイル");
  129.     YGB_color(gwork,_C(12,12,12));
  130.     YGB_fontSize(gwork,3,6);
  131.     YGB_print(gwork,179,13,"▼");
  132.     YGU_addPullDownMenu(top,113,0,80,18,fileMenu_PD,113,19,6,12);
  133.     
  134.     /* 最適化メニュー (itm[3])*/
  135.     SGB_proButton(gwork,193,0,260,18, _C(0,0,0));
  136.     YGB_color(gwork,_C(27,27,27));
  137.     YGB_fontSize(gwork,6,12);
  138.     YGB_print(gwork,208,14,"最適化");
  139.     YGB_color(gwork,_C(12,12,12));
  140.     YGB_fontSize(gwork,3,6);
  141.     YGB_print(gwork,247,13,"▼");
  142.     YGU_addPullDownMenu(top,193,0,68,18,optimize_PD,193,19,6,12);
  143.     
  144.     
  145.     /* 現在のパターン番号等表示 */
  146.     YGB_fontSize(gwork,6,12);
  147.     SGB_holButton(gwork,print_x,print_y,print_x+191,print_y+15,_C(0,0,0));
  148.     YGB_color(gwork,_C(27,27,27));
  149.     YGB_print(gwork,print_x+2,print_y+13,"now:");
  150.     SPM_printNumber(0);
  151.     
  152.     
  153.     /* 各キャラデータの表示ウィンドウ(itm[4]-itm[27]) */
  154.     x = sprWin_x;
  155.     y = sprWin_y;
  156.     /* パターン表示 */
  157.     SGB_proButton(gwork,x  ,y,  x+75,y+75, _C(22,22,22));
  158.     SGB_holButton(gwork,x+6,y+6,x+69,y+69, _C(0,0,0));
  159.     /* パレットの表示 */
  160.     SGB_holButton(gwork,x   ,y+78,x+74,y+98, _C(0,0,0));
  161.     
  162.     if ((buf=malloc(76*99*2))==NULL)
  163.     {    SPM_errMes("メモリが少な過ぎます");    term(); exit(1); }
  164.     YGB_getPattern(gwork,buf,x,y,x+75,y+98);
  165.     
  166.     /* コピーする(一回余分があるけどまあいいね(^^;)) */
  167.     for (j=0;j<4;j++)
  168.     {
  169.         for (i=0;i<6;i++)
  170.         {
  171.             /* ボタンとして登録 */
  172.             x = i * sprWinStep_x + sprWin_x;
  173.             y = j * sprWinStep_y + sprWin_y;
  174.             YGB_putPattern(gwork,buf,x,y,x+75,y+98);
  175.             YGU_addButton(top,x+6,y+6,64,64);
  176.             
  177.         }
  178.     }
  179.     free(buf);
  180.     
  181.     /* スクロールバー (itm[28])*/
  182.     YGU_addLongitudinalbar(gwork,top,0,20,12,458,1,1);
  183.     YGB_writeMode(gwork,PSET);
  184.     
  185.     
  186.     
  187.     return(top);
  188. }
  189.  
  190.  
  191. /* タイトルメニューだ */
  192. void    titleMenu(ITEM *tit)
  193. {
  194.     switch(YGU_getPullDown(tit))
  195.     {
  196.         default: break;
  197.         case 1:    sdk_invoke(); break;
  198.         case 2: SPM_freeMem(); break;
  199.         case 3: SPM_redraw(); break;
  200.     }
  201.     return;
  202. }
  203.  
  204.  
  205. /* ファイルメニュー */
  206. void    fileMenu(ITEM *fil)
  207. {
  208.     switch(YGU_getPullDown(fil))
  209.     {
  210.         case 1:
  211.             if (PATNUM!=0)
  212.             {
  213.                 if (SPM_sure(" @@ @@ 本当にロードしていいですか? ",0)==1)
  214.                     SPM_readNewPAT();
  215.                 break;
  216.             }
  217.             else
  218.             {
  219.                 SPM_readNewPAT();
  220.                 break;
  221.             }
  222.         case 2:        SPM_addPAT();    break;
  223.         case 3:        SPM_savePAT();    break;
  224.         case 4:
  225.             if (PATNUM!=0)
  226.             {
  227.                 if (SPM_sure(" @@ @@ 本当にロードしていいですか? ",0)==1)
  228.                     SPM_readNewSPP();
  229.                 break;
  230.             }
  231.             else
  232.             {
  233.                 SPM_readNewSPP();
  234.                 break;
  235.             }
  236.         /* case 5.5:        SPM_addSPP();    break; */
  237.         case 5:        SPM_saveSPP();    break;
  238.         default:    break;
  239.     }
  240.     return;
  241. }
  242.  
  243.  
  244. /* オプティマイズメニュー */
  245. void    optimizeMenu(ITEM *opt)
  246. {
  247.     switch(YGU_getPullDown(opt))
  248.     {
  249.         default: break;
  250.         case 1:SPM_all16();    break;
  251.         case 2:SPM_all32K(); break;
  252.         case 3:SPM_under16(); break;
  253.         case 4:SPM_arrangePALnumber(); break;
  254.         /* 範囲・条件付き最適化 */
  255.         case 5:SPM_limit16();    break;
  256.         case 6:SPM_limit32K();    break;
  257.         case 7:SPM_pushed();    break;
  258.         /* 透過色の指定 */
  259.         case 8:SPM_setThru();    break;
  260.     }
  261.     return;
  262. }
  263.  
  264.  
  265.  
  266.  
  267. /* ズーム */
  268. void    zoomView(int x,int y,int mag,int num,short *tmpbuf)
  269. {
  270.     char    para[17];
  271.     int        px,py,i,j,loop_x,loop_y;
  272.     px=pter[num].patx*16;    py=pter[num].paty*16;
  273.     
  274.     _fill_char(magBuf,256*256*2,0);
  275.     
  276.     loop_x=(px<256/mag) ? px : 256/mag;
  277.     loop_y=(py<256/mag) ? py : 256/mag;
  278.     
  279.     YGB_writeMode(gwork,PSET);
  280.     
  281.     MOS_disp(0);
  282.     
  283.     for    (j=0;j<loop_y;j++)
  284.     {
  285.         for (i=0;i<loop_x;i++)
  286.             magBuf[j*256/mag + i]=tmpbuf[(j+y)*px+i+x];
  287.     }
  288.     /*
  289.     for (j=loop_y;j<256/mag;j++)
  290.     {
  291.         for (i=0;i<256/mag;i++)
  292.             magBuf[j*256/mag + i]=0;
  293.     }
  294.     */
  295.     
  296.     if (mag!=1)
  297.     {
  298.         DWORD (para)   =(US int)magBuf;
  299.         WORD  (para+4) =getds();
  300.         WORD  (para+6) =view_x0+6;
  301.         WORD  (para+8) =view_y0+22;
  302.         WORD  (para+10)=view_x0+261;
  303.         WORD  (para+12)=view_y0+277;
  304.         WORD  (para+14)=(US short)256/mag;
  305.         WORD  (para+16)=(US short)256/mag;
  306.         
  307.         EGB_putBlockZoom(gwork,0,para);
  308.     }
  309.     else
  310.         YGB_putPattern(gwork,(char*)magBuf,view_x0+6,view_y0+22,
  311.                         view_x0+261,view_y0+277);
  312.     
  313.     MOS_disp(1);
  314.     
  315.     return;
  316. }
  317.  
  318. /* スクロールバーでキャラクタ表示 */
  319. void    scr_bar(ITEM *bar_x,ITEM *bar_y,int mag,int num,short *tmpbuf)
  320. {
  321.     static int    pre_x=-1;
  322.     static int    pre_y=-1;
  323.     int        x,y;
  324.     
  325.     x=YGU_getScrollBarPointer(bar_x);
  326.     y=YGU_getScrollBarPointer(bar_y);
  327.     
  328.     if ( (pre_x!=x)||(pre_y!=y) )
  329.         zoomView(x,y,mag,num,tmpbuf);
  330.     pre_x=x;    pre_y=y;
  331.     return;
  332. }
  333.  
  334. /* 伝染メニュー */
  335. void    infection()
  336. {
  337.     SPM_sure(" @@ @@まだできてないんです(;-;)",2);
  338.     return;
  339. }
  340.  
  341.  
  342.  
  343.  
  344. /* 1パターン加工 */
  345. void    patWindow(int num)
  346. {
  347.     if (num>=PATNUM)
  348.         return;
  349.     
  350.     short     *tmpbuf;
  351.     ITEM    *pwin,*itms[30],*act=NULL;
  352.     char    str[20];
  353.     char    str1[4];
  354.     int        i;
  355.     int        mag;    /* 拡大率 */
  356.     int        inum;
  357.     int        patx=pter[num].patx*16;
  358.     int        paty=pter[num].paty*16;
  359.     int        px,py,mx,my,dmy;
  360.     
  361.     px=pter[num].patx*16;    py=pter[num].paty*16;
  362.     
  363.     mag=(patx>paty) ? patx : paty;
  364.     mag=256/mag;
  365.     
  366.     if (mag==16)
  367.         mag=16;
  368.     else if (mag>=8)
  369.         mag=8;
  370.     else if (mag>=4)
  371.         mag=4;
  372.     else if (mag>=2)
  373.         mag=2;
  374.     else
  375.         mag=1;
  376.     
  377.     
  378.     pwin_st:;
  379.     
  380.     MOS_disp(0);
  381.     
  382.     if ((tmpbuf=malloc(px*py*2))==NULL)
  383.     { SPM_errMes("メモリが足りません");    return; }
  384.     
  385.     SPM_expand(num,px,py,PAL[pter[num].palnum],tmpbuf);
  386.     
  387.     
  388.     
  389.     YGB_getPattern(gwork,zoomDlgBuf,view_x0,view_y0,view_x0+view_lx-1,
  390.                         view_y0+view_ly-1);
  391.     
  392.     /* ルーペ、ダイアログベース */
  393.     SGB_proButton(gwork,view_x0,view_y0,view_x0+336,view_y0+356, _C(6,6,6));
  394.     
  395.         /* 終了ボタン...1 */
  396.     SGB_gradProButton(gwork,view_x0+2,view_y0+2,view_x0+19,view_y0+19,
  397.                         _C(24,24,24),_C(6,6,6),0);
  398.     pwin=YGU_addButton(NULL,view_x0+2,view_y0+2,18,18);
  399.     
  400.         /* スプライト表示ウィンドウ */
  401.     YGB_color(gwork,_C(0,0,0));
  402.     YGB_boxFul(gwork,view_x0+6,view_y0+22,view_x0+277,view_y0+277);
  403.         /* スクロールバー 横...2,縦...3*/
  404.     YGU_addLateralbar(gwork,pwin,view_x0+6,view_y0+278,256,16,
  405.                         patx,256/mag);
  406.     YGU_addLongitudinalbar(gwork,pwin,view_x0+262,view_y0+22,16,256,
  407.                         paty,256/mag);
  408.     
  409.     YGB_writeMode(gwork,PSET);
  410.         /* COPY(4) PASTE(5)ボタン */
  411.     SGB_proButton(gwork,view_x0+289,view_y0+308,view_x0+334,view_y0+323,
  412.                      _C(6,6,12));
  413.     YGU_addButton(pwin,view_x0+289,view_y0+308,46,16);
  414.     YGB_color(gwork,_C(27,27,27));
  415.     YGB_fontSize(gwork,6,12);
  416.     YGB_print(gwork,view_x0+294,view_y0+321," COPY ");
  417.     SGB_proButton(gwork,view_x0+289,view_y0+331,view_x0+334,view_y0+346,
  418.                      _C(6,6,12));
  419.     YGU_addButton(pwin,view_x0+289,view_y0+331,46,16);
  420.     YGB_color(gwork,_C(27,27,27));
  421.     YGB_print(gwork,view_x0+294,view_y0+344," PASTE ");
  422.         /* パレット表示 */
  423.     SGB_holButton(gwork,view_x0+9,view_y0+306,view_x0+252,view_y0+325,
  424.                      _C(0,0,0));
  425.     if (pter[num].palnum!=-1)
  426.     {
  427.         for (i=0;i<16;i++)
  428.         {
  429.             YGB_color(gwork,PAL[pter[num].palnum][i]);
  430.             YGB_boxFul(gwork,view_x0+11+i*15,view_y0+308,view_x0+24+i*15,
  431.                 view_y0+323);
  432.         }
  433.     }
  434.     else
  435.     {
  436.         YGB_color(gwork,_C(20,20,20));
  437.         YGB_print(gwork,view_x0+15,view_y0+322,"No palette data");
  438.     }
  439.         /* 結線 */
  440.     YGB_color(gwork,_C(14,14,22));
  441.     YGB_boxFul(gwork,view_x0+254,view_y0+315,view_x0+287,view_y0+316);
  442.     YGB_color(gwork,_C(14,14,22));
  443.     YGB_boxFul(gwork,view_x0+270,view_y0+338,view_x0+287,view_y0+339);
  444.     YGB_color(gwork,_C(14,14,22));
  445.     YGB_boxFul(gwork,view_x0+270,view_y0+317,view_x0+271,view_y0+337);
  446.     
  447.         /* 文字 */
  448.     YGB_color(gwork,_C(25,25,25));
  449.     sprintf(str,"Pattern No.%04d",num);
  450.     YGB_print(gwork,view_x0+16,view_y0+342,str);
  451.     
  452.     if (pter[num].palnum!=-1)
  453.         sprintf(str,"Palette No.%04d",pter[num].palnum);
  454.     else
  455.         sprintf(str,"32K data...");
  456.     YGB_print(gwork,view_x0+163,view_y0+342,str);
  457.     YGB_color(gwork,_C(12,12,24));
  458.     YGB_line(gwork,view_x0+229,view_y0+344,view_x0+252,view_y0+344);
  459.     YGB_color(gwork,_C(24,4,4));
  460.     YGB_line(gwork,view_x0+82,view_y0+344,view_x0+105,view_y0+344);
  461.         /* 倍率変更ボタン(6-10) */
  462.     for (i=0;i<5;i++)
  463.     {
  464.         if (mag==(1<<i))
  465.             SGB_strHolButton(gwork,view_x0+288,view_y0+34+i*17,
  466.             _C(0,0,0),zoomStr[i],6,12,0,_C(13,31,24));
  467.         else
  468.             SGB_strProButton(gwork,view_x0+288,view_y0+34+i*17,
  469.             _C(0,0,0),zoomStr[i],6,12,0,_C(18,18,18));
  470.     }
  471.     for (i=0;i<5;i++)
  472.         YGU_addButton(pwin,view_x0+288,view_y0+34+17*i,40,18);
  473.     
  474.     zoomView(0,0,mag,num,tmpbuf);
  475.     
  476.     
  477.     MOS_rdpos(&dmy,&mx,&my);
  478.     MOS_setpos(0,0);
  479.     MOS_disp(1);
  480.     MOS_disp(0);
  481.     
  482.         /* 最適化ボタン (11)*/
  483.     if (pter[num].palnum==-1 && pter[num].p32buf!=NULL)
  484.         SGB_strProButton(gwork,view_x0+282,view_y0+128,_C(18,6,6),
  485.                             " 最適化 ",6,12,0,_C(27,27,27));
  486.     else if (pter[num].p32buf!=NULL)
  487.         SGB_strProButton(gwork,view_x0+282,view_y0+128,_C(6,6,18),
  488.                             " 32K に ",6,12,0,_C(27,27,27));
  489.     else
  490.         SGB_strHolButton(gwork,view_x0+282,view_y0+128,_C(2,2,8),
  491.                             "必要なし",6,12,0,_C(13,13,13));
  492.     
  493.     YGU_addButton(pwin,view_x0+282,view_y0+128,52,16);
  494.     
  495.     MOS_setpos(mx,my);
  496.     
  497.         /* 最適化レベル用スクロールバー(12) */
  498.     YGU_addLongitudinalbar(gwork,pwin,view_x0+288,view_y0+148,
  499.                             12,128,320,16);
  500.         /* 最適化レベル目安表示 */
  501.     YGB_writeMode(gwork,PSET);
  502.     YGB_color(gwork,_C(24,24,24));
  503.     for (i=0;i<3;i++)
  504.         YGB_print(gwork,view_x0+303,view_y0+176+i*42,meyastr[i]);
  505.         /* レベルの数値を表示 */
  506.     sprintf(str1,"%03d",OP_LEVEL);
  507.     SGB_strHolButton(gwork,view_x0+282,view_y0+280,_C(0,0,0),
  508.                         str1,6,12,0,_C(24,24,24));
  509.     
  510.         /* 伝染(^^;)ボタン(13) */
  511.     #if 0
  512.     SGB_strProButton(gwork,view_x0+288,view_y0+8,
  513.                         _C(11,11,11)," 伝染 ",6,12,0,_C(31,31,31));
  514.     YGU_addButton(pwin,view_x0+288,view_y0+6,40,16);
  515.     #endif
  516.     
  517.     
  518.     itms[0]=pwin;
  519.     for (i=1;i<12;i++)
  520.         itms[i]=YGU_nextItem(itms[i-1]);
  521.     
  522.     YGU_setScrollBarPointer(gwork,itms[11],OP_LEVEL);
  523.     
  524.     
  525.     
  526.     
  527.     MOS_disp(1);
  528.     
  529.     while (act!=pwin)
  530.     {
  531.         act=YGU_allItemsAction(gwork,pwin);
  532.         inum=YGU_itemSerialNumber(pwin,act);
  533.         switch(inum)
  534.         {
  535.             case 1:    break;
  536.             case 2..3:    scr_bar(itms[1],itms[2],mag,num,tmpbuf);break;
  537.             case 4:    /* COPY */
  538.                 if (pter[num].palnum==-1)
  539.                 {    SPM_errMes("16色パターンにしか出来ません"); break; }
  540.                 if (SPM_sure(" @@ @@このパターンのパレットを退避します",0)==1)
  541.                 {
  542.                     if (stkpal!=-1)
  543.                     {
  544.                         PAL_USE[stkpal]--;
  545.                         if (PAL_USE[stkpal]==0)
  546.                             PALNUM--;
  547.                     }
  548.                     stkpal=pter[num].palnum;
  549.                     PAL_USE[stkpal]++;
  550.                 }
  551.                 
  552.                 break;
  553.             case 5:    /* PASTE */
  554.                 if (pter[num].palnum==-1)
  555.                 {    SPM_errMes("一旦16色に最適化してください"); break; }
  556.                 if (stkpal==-1)
  557.                 {    SPM_errMes("バッファにパレットが有りません"); break; }
  558.                 if (SPM_sure(" @@パレットをこれと差し替えます",9999)==1)
  559.                 {
  560.                     if (pter[num].p32buf==NULL)
  561.                     {
  562.                         if (SPM_plus32K(num)!=0)
  563.                             break;
  564.                     }
  565.                     PAL_USE[pter[num].palnum]--;
  566.                     if (PAL_USE[pter[num].palnum]==0)
  567.                         PALNUM--;
  568.                     pter[num].palnum=stkpal;
  569.                     PAL_USE[stkpal]++;
  570.                     if (SOP_optimize(pter[num].patbuf,PAL[pter[num].palnum],
  571.                         pter[num].p32buf,pter[num].patx*pter[num].paty*256)!=0)
  572.                     { SPM_errMes("最適化中にエラーが生じました");break;}
  573.                     YGU_deleteAll(pwin);
  574.                     YGB_putPattern(gwork,zoomDlgBuf,
  575.                         view_x0,view_y0,view_x0+view_lx-1,view_y0+view_ly-1);
  576.                     free(tmpbuf);
  577.                     SPM_showOne(num);
  578.                     SPM_printNumber(WINTOP*6);
  579.                     MOS_disp(1);
  580.                     goto    pwin_st;
  581.                 }
  582.                 break;
  583.             case 6..10: 
  584.             {
  585.                 mag=(1<<inum-6);
  586.                 MOS_disp(0);
  587.                 for (i=0;i<5;i++)
  588.                 {
  589.                     if (mag==(1<<i))
  590.                         SGB_strHolButton(gwork,view_x0+288,view_y0+34+i*17,
  591.                         _C(0,0,0),zoomStr[i],6,12,0,_C(13,31,24));
  592.                     else
  593.                         SGB_strProButton(gwork,view_x0+288,view_y0+34+i*17,
  594.                         _C(0,0,0),zoomStr[i],6,12,0,_C(18,18,18));
  595.                 }
  596.                 YGU_resetScrollBar(gwork,itms[1],patx,256/mag);
  597.                 YGU_resetScrollBar(gwork,itms[2],paty,256/mag);
  598.                 YGB_writeMode(gwork,PSET);
  599.                 MOS_disp(1);
  600.                 zoomView(0,0,mag,num,tmpbuf);break;
  601.             }
  602.             case 11:
  603.             {
  604.                 int        dotnum=pter[num].patx*pter[num].paty*256;
  605.                 short    *patbuf=pter[num].p32buf;
  606.                 int        flag=0,ret;
  607.                 
  608.                 if (pter[num].palnum==-1)
  609.                 {
  610.                     for (i=0;i<1024;i++)
  611.                     {
  612.                         if (PAL_USE[i]==0)
  613.                         {
  614.                             PAL_USE[i]++; flag=1;
  615.                             pter[num].palnum=i;    PALNUM++;
  616.                             break;
  617.                         }
  618.                     }
  619.                     if (flag==0)
  620.                         {SPM_errMes("パレットの定義数が多すぎます");break;}
  621.                     
  622.                     ret=SOP_selPal(PAL[pter[num].palnum],patbuf,dotnum,
  623.                                     OP_LEVEL*OP_LEVEL);
  624.                     if (ret!=0)
  625.                     { SPM_errMes("最適化中にメモリ不足が生じました。");break;}
  626.                     ret=SOP_optimize(pter[num].patbuf,
  627.                                 PAL[pter[num].palnum],patbuf,dotnum);
  628.                     if (ret!=0)
  629.                     { SPM_errMes("最適化中にメモリ不足が生じました。");break;}
  630.                     YGU_deleteAll(pwin);
  631.                     MOS_disp(0);
  632.                     YGB_putPattern(gwork,zoomDlgBuf,
  633.                         view_x0,view_y0,view_x0+view_lx-1,view_y0+view_ly-1);
  634.                     free(tmpbuf);
  635.                     SPM_showOne(num);
  636.                     SPM_printNumber(WINTOP*6);
  637.                     MOS_disp(1);
  638.                     goto    pwin_st;
  639.                 }
  640.                 else
  641.                 {
  642.                     if ((--PAL_USE[pter[num].palnum]) == 0)
  643.                         PALNUM--;
  644.                     pter[num].palnum=-1;
  645.                     YGU_deleteAll(pwin);
  646.                     MOS_disp(0);
  647.                     YGB_putPattern(gwork,zoomDlgBuf,
  648.                         view_x0,view_y0,view_x0+view_lx-1,view_y0+view_ly-1);
  649.                     free(tmpbuf);
  650.                     SPM_showOne(num);
  651.                     SPM_printNumber(WINTOP*6);
  652.                     MOS_disp(1);
  653.                     goto    pwin_st;
  654.                 }
  655.             }
  656.             case 12:
  657.             {
  658.                 OP_LEVEL=YGU_getScrollBarPointer(itms[11]);
  659.                 YGB_writeMode(gwork,PSET);
  660.                 sprintf(str1,"%03d",OP_LEVEL);
  661.                 MOS_disp(0);
  662.                 SGB_strHolButton(gwork,view_x0+282,view_y0+280,_C(0,0,0),
  663.                                     str1,6,12,0,_C(24,24,24));
  664.                 MOS_disp(1);
  665.                 break;
  666.             }
  667.             case 13:
  668.             {
  669.                 infection();
  670.                 break;
  671.             }
  672.             
  673.             default:;
  674.         }
  675.     }
  676.     YGU_deleteAll(pwin);
  677.     MOS_disp(0);
  678.     YGB_putPattern(gwork,zoomDlgBuf,
  679.         view_x0,view_y0,view_x0+view_lx-1,view_y0+view_ly-1);
  680.     MOS_disp(1);
  681.     free(tmpbuf);
  682.     
  683.     
  684.     
  685.     
  686.     return;
  687. }
  688.  
  689.  
  690. void    execItems(ITEM *ext)
  691. {
  692.     int        next;
  693.     int        i,num;
  694.     ITEM    *act=NULL;
  695.     
  696.     itm[1]=ext;
  697.     for (i=2;i<30;i++)
  698.         itm[i]=YGU_nextItem(itm[i-1]);
  699.     
  700.     while (act!=ext)
  701.     {
  702.         act=YGU_allItemsAction(gwork,ext);
  703.         num=YGU_itemSerialNumber(ext,act);
  704.         switch(num)
  705.         {
  706.             default: break;
  707.             case 1:    break;
  708.             case 2:    titleMenu(itm[2]);        break;
  709.             case 3: fileMenu(itm[3]);        break;
  710.             case 4:    optimizeMenu(itm[4]);    break;
  711.             case 5..28: patWindow(num-5+WINTOP*6);    break;
  712.             case 29:
  713.             {
  714.                 next=YGU_getScrollBarPointer(itm[29]);
  715.                 if (_abs(next-WINTOP)>=3)
  716.                 {
  717.                     WINTOP=next;
  718.                     SPM_showWindow(WINTOP*6);
  719.                     SPM_printNumber(WINTOP*6);
  720.                 }
  721.                 else if (next!=WINTOP)
  722.                     SPM_scrollShowWindow(next-WINTOP);
  723.                     SPM_printNumber(WINTOP*6);
  724.                 
  725.                 YGB_writeMode(gwork,PSET);
  726.             }
  727.         }
  728.     }
  729.     
  730.     YGU_deleteAll(ext);
  731.     return;
  732. }
  733.  
  734.  
  735.  
  736.  
  737. /* メイン */
  738. int        main(int argc,char *argv[])
  739. {
  740.     
  741.     path[0]=0;
  742.     ITEM    *top;
  743.     
  744.     init();                                    /* 各種初期化 */
  745.     /* メモリの確保 */
  746.     if ((sureBuf=malloc(248*121*2))==NULL)
  747.     {
  748.         YGB_color(gwork,_C(27,27,31));
  749.         YGB_print(gwork,120,200,
  750.                     "RAMDISKをはずすか、残念だけどメモリを買うかしてね");
  751.         term();
  752.         return(1);
  753.     }
  754.     if ((fileSelBuf=malloc(120*248*2))==NULL)
  755.     {    SPM_sure(" @@ @@メモリが足りません(;-;)",2); term(); return(1); }
  756.     if ((zoomDlgBuf=malloc(view_lx*view_ly*2))==NULL)
  757.     {    SPM_sure(" @@ @@メモリが足りません(;-;)",2); term(); return(1); }
  758.     if ((magBuf=malloc(256*256*2))==NULL)
  759.     {    SPM_sure(" @@ @@メモリが足りません(;-;)",2); term(); return(1); }
  760.     if ((sureBuf=malloc(248*121*2))==NULL)
  761.     {    SPM_sure(" @@ @@メモリが足りません(;-;)",2); term(); return(1); }
  762.     if ((errMesBuf=malloc(485*16*2))==NULL)
  763.     {    SPM_sure(" @@ @@メモリが足りません(;-;)",2); term(); return(1); }
  764.     if ((frameBuf=malloc(76*99*2))==NULL)
  765.     {    SPM_sure(" @@ @@メモリが足りません(;-;)",2); term(); return(1); }
  766.     
  767.     top=addItems();                            /* アイテムの登録→実行 */
  768.     MOS_disp(1);
  769.     SPM_about();                            /* あばうと */
  770.     execItems(top);
  771.     term();                                    /* 終了 */
  772.     return(0);
  773. }
  774.